#include "ht1621b.h"
#include "pico/stdlib.h"
#include "hardware/gpio.h"
#include "FreeRTOS.h"
#include "task.h"
#include "LOG.h"
#include <string.h>
#include "board.h"
#include "ds3231_rtc.h" // 添加DS3231 RTC头文件
#include "buzzer.h"

uint8_t lcd_buffer[HT1621B_BUFFER_SIZE];

// HT1621B发送位数据
static void ht1621b_send_bits(uint32_t data, uint8_t bits)
{
    for (int i = bits - 1; i >= 0; i--) {
        // 设置数据位
        gpio_put(HT1621B_DATA_PIN, (data >> i) & 0x01);
        
        // WR下降沿写入数据
        gpio_put(HT1621B_WR_PIN, 0);
        sleep_us(5);  // 调整延时以满足时序要求
        gpio_put(HT1621B_WR_PIN, 1);
        sleep_us(5);  // 调整延时以满足时序要求
    }
}

// HT1621B发送命令
bool ht1621b_send_command(uint8_t cmd) {
    // 拉低CS片选
    gpio_put(HT1621B_CS_PIN, 0);
    sleep_us(5);  // 确保CS稳定
    
    // 发送命令标识位(1000)
    ht1621b_send_bits(0x08, 4);
    
    // 发送命令数据
    ht1621b_send_bits(cmd, 8);
    
    // 拉高CS片选
    gpio_put(HT1621B_CS_PIN, 1);
    sleep_us(5);  // 确保CS稳定
    
    return true;
}

// HT1621B写入数据（不更新缓冲区标记）
bool ht1621b_write_data_no_update(uint8_t addr, uint8_t data) {
    // 拉低CS片选
    gpio_put(HT1621B_CS_PIN, 0);
    sleep_us(5);  // 确保CS稳定
    
    // 发送写数据标识位(101)
    ht1621b_send_bits(0x05, 3);
    
    ht1621b_send_bits(addr , 6);
    
    // 发送数据（4位）
    ht1621b_send_bits(data, 4);
    
    // 拉高CS片选
    gpio_put(HT1621B_CS_PIN, 1);
    sleep_us(5);  // 确保CS稳定
    
    return true;
}

// HT1621B写入数据
bool ht1621b_write_data(uint8_t addr, uint8_t data) {
    // 拉低CS片选
    gpio_put(HT1621B_CS_PIN, 0);
    sleep_us(5);  // 确保CS稳定
    
    // 发送写数据标识位(101)
    ht1621b_send_bits(0x05, 3);
    
    ht1621b_send_bits(addr , 6);
    
    // 发送数据（4位）
    ht1621b_send_bits(data, 4);
    
    // 拉高CS片选
    gpio_put(HT1621B_CS_PIN, 1);
    sleep_us(5);  // 确保CS稳定
    
    // 更新缓冲区
    if (addr < HT1621B_BUFFER_SIZE) {
        lcd_buffer[addr] = data;
    }
    
    return true;
}

// HT1621B写入单个数字
bool ht1621b_write_single_digit(uint8_t addr, uint8_t digit) {
    // 拉低CS片选
    gpio_put(HT1621B_CS_PIN, 0);
    sleep_us(5);  // 确保CS稳定
    
    // 发送写数据标识位(101)
    ht1621b_send_bits(0x05, 3);
    
    ht1621b_send_bits(addr, 6);
    
    // 发送数字（8位）
    ht1621b_send_bits(digit, 8);
    
    // 拉高CS片选
    gpio_put(HT1621B_CS_PIN, 1);
    sleep_us(5);  // 确保CS稳定
    
    // 更新缓冲区
    if (addr < HT1621B_BUFFER_SIZE) {
        lcd_buffer[addr] = digit;
    }
    
    return true;
}

// HT1621B写入缓冲区（不更新刷新标记）
bool ht1621b_write_buffer_no_update(uint8_t *buffer, uint8_t len) {
    // 拉低CS片选
    gpio_put(HT1621B_CS_PIN, 0);
    sleep_us(5);  // 确保CS稳定
    
    // 发送写数据标识位(101)
    ht1621b_send_bits(0x05, 3);
    
    ht1621b_send_bits(0x00, 6);
    
    // 发送数据
    for (int i = 0; i < len && i < HT1621B_BUFFER_SIZE; i++) {
        // 发送数据（4位）
        ht1621b_send_bits(buffer[i], 4);
    }
    
    // 拉高CS片选
    gpio_put(HT1621B_CS_PIN, 1);
    sleep_us(5);  // 确保CS稳定
    
    return true;
}


// HT1621B写入缓冲区
bool ht1621b_write_buffer(uint8_t *buffer, uint8_t len) {
    // 拉低CS片选
    gpio_put(HT1621B_CS_PIN, 0);
    sleep_us(5);  // 确保CS稳定
    
    // 发送写数据标识位(101)
    ht1621b_send_bits(0x05, 3);
    
    ht1621b_send_bits(0x00, 6);
    
    // 发送数据
    for (int i = 0; i < len && i < HT1621B_BUFFER_SIZE; i++) {
        // 发送数据（4位）
        ht1621b_send_bits(buffer[i], 4);
        
        // 更新缓冲区
        lcd_buffer[i] = buffer[i];
    }
    
    // 拉高CS片选
    gpio_put(HT1621B_CS_PIN, 1);
    sleep_us(5);  // 确保CS稳定
    
    return true;
}

// HT1621B初始化
bool ht1621b_init(void) {
    LOG_INFO("ht1621b_init - Initializing HT1621B LCD driver");
    
    // 初始化GPIO引脚
    LOG_INFO("  - Initializing GPIO pins (CS=%d, RD=%d, WR=%d, DATA=%d)", 
             HT1621B_CS_PIN, HT1621B_RD_PIN, HT1621B_WR_PIN, HT1621B_DATA_PIN);
    
    gpio_init(HT1621B_CS_PIN);
    gpio_set_dir(HT1621B_CS_PIN, GPIO_OUT);
    gpio_put(HT1621B_CS_PIN, 1);  // 默认高电平
    
    gpio_init(HT1621B_RD_PIN);
    gpio_set_dir(HT1621B_RD_PIN, GPIO_OUT);
    gpio_put(HT1621B_RD_PIN, 1);  // 默认高电平
    
    gpio_init(HT1621B_WR_PIN);
    gpio_set_dir(HT1621B_WR_PIN, GPIO_OUT);
    gpio_put(HT1621B_WR_PIN, 1);  // 默认高电平
    
    gpio_init(HT1621B_DATA_PIN);
    gpio_set_dir(HT1621B_DATA_PIN, GPIO_OUT);
    gpio_put(HT1621B_DATA_PIN, 0);  // 默认低电平
    
    // 清空显示缓冲区
    memset(lcd_buffer, 0, sizeof(lcd_buffer));
    
    // 发送初始化命令序列
    LOG_INFO("  - Sending initialization commands");

    sleep_ms(20); // 延时使LCD工作电压稳定

    // 使用外部32KHz时钟
    ht1621b_send_command(HT1621B_CMD_SYSTEM_CLOCK_RC);

    // 偏压设置和COM设置
    ht1621b_send_command(HT1621B_CMD_BIAS_1_3 | HT1621B_CMD_COM_3);
    
    // 关闭系统
    ht1621b_send_command(HT1621B_CMD_SYSTEM_DISABLE);
    
    // 关闭看门狗和定时器
    ht1621b_send_command(HT1621B_CMD_WDT_DISABLE);
    ht1621b_send_command(HT1621B_CMD_TIMER_DISABLE);
    
    // 打开系统
    ht1621b_send_command(HT1621B_CMD_SYSTEM_ENABLE);
    
    // 打开LCD显示
    ht1621b_send_command(HT1621B_CMD_LCD_ON);
    
    sleep_ms(20); // 延时一段时间
    
    // 清空显示
    uint8_t clear_buffer[HT1621B_BUFFER_SIZE] = {0};
    ht1621b_write_buffer(clear_buffer, HT1621B_BUFFER_SIZE);
    
    LOG_INFO("ht1621b_init completed successfully");
    return true;
}

// 全亮显示（所有段码都点亮）
void ht1621b_display_all_segments(void) {
    uint8_t display_buffer[HT1621B_BUFFER_SIZE] = {0};
    
    // 填充所有段码为全亮（0xFF）
    for (int i = 0; i < HT1621B_BUFFER_SIZE; i++) {
        display_buffer[i] = 0xFF;
    }
    
    // 写入显示缓冲区
    ht1621b_write_buffer(display_buffer, HT1621B_BUFFER_SIZE);
    
    LOG_INFO("HT1621B - All segments lit");
}

void* ht1621b_get_lcd_buffer(void)
{
    return lcd_buffer;
}

void ht1621b_clear_buffer(void)
{
    memset(lcd_buffer, 0, sizeof(lcd_buffer));
}

void ht1621b_display_update(void)
{
    ht1621b_write_buffer(lcd_buffer, HT1621B_BUFFER_SIZE);
}
